﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FezLogForSns
{
	#region 列挙型の属性にラベル追加
	/// <summary>
	/// 列挙型を拡張子し、フィールドにラベル文字列を付加するカスタム属性です。
	/// </summary>
	[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
	public class LabeledEnumAttribute
		: Attribute
	{
		/// <summary>
		/// ラベル文字列。
		/// </summary>
		private string label;

		/// <summary>
		/// LabeledEnumAttribute クラスの新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="label">ラベル文字列</param>
		public LabeledEnumAttribute(string label)
		{
			this.label = label;
		}

		/// <summary>
		/// 属性で指定されたラベル文字列を取得する。
		/// </summary>
		/// <param name="value">ラベル付きフィールド</param>
		/// <returns>ラベル文字列</returns>
		public static string GetLabel(Enum value)
		{
			Type enumType = value.GetType();
			string name = Enum.GetName(enumType, value);
			LabeledEnumAttribute[] attrs =
				(LabeledEnumAttribute[])enumType.GetField(name)
				.GetCustomAttributes(typeof(LabeledEnumAttribute), false);

			if (attrs.Length == 0)
				return "";
			return attrs[0].label;
		}
	}
	#endregion

	#region 拡張メソッド
	static class Extensions
	{
		/// <summary>
		/// 数値型の文字列だった場合カンマを振ります。
		/// </summary>
		/// <param name="str"></param>
		/// <returns></returns>
		public static string numberFormat(this string str)
		{
			long intval;
			if (long.TryParse(str, out intval))
			{
				return String.Format("{0:N0}", intval);
			}
			else return str;
		}

		/// <summary>
		/// enumのラベル属性を返します。
		/// </summary>
		/// <param name="str"></param>
		/// <returns></returns>
		public static string label(this Enum value)
		{
			return LabeledEnumAttribute.GetLabel(value);
		}
	}
	#endregion
}
